MinGW on Linux
以下に説明した内容は、文章の作成時から随分と時間が経っているため、扱っているソフトウェアのバージョン番号などが古くなってしまっています。しかし、基本的な考え方は変わっていませんので、適宜ご使用のバージョンに読み換えて下さい。
MinGWのクロスコンパイル環境構築
Windows 上で MinGW を効率良く利用するためには、通常は MSYS という bash シェルベースのシステムをインストールして、GNU のツール群を利用できるようにします。また、Cygwin 環境から MinGW のコンパイラを利用する場合もあるでしょう。
GNU のツール群を使った作業は(例外はありますが)基本的にコンソール上の作業になります。つまり、GUI 環境の Windows 上に CUI による別環境を作ることになります。
一方、GCC はネイティブコンパイラとクロスコンパイラに対応しています。MinGW の GCC も例外ではありません。もし Windows の他に Linux のような(GCC が標準のコンパイラに採用されている)UNIX 系 OS 環境も利用できるのであれば、わざわざ Cygwin や MSYS などの環境を Windows 上に用意しなくとも、UNIX 系 OS 環境で MinGW のクロスコンパイルをできるようにして、Windows アプリケーションを作成する事もできます。
本サイトでは Linux 上に MinGW のクロスコンパイル環境を作り、Windows のアプリケーションをコンパイルする方法や関連リソースの紹介をします。
ビットウォークの開発環境
参考までに弊社の開発環境を図1に示しました。メインの開発マシンである Linux PC と Windows PC はそれぞれネットワーク上にあり、Linux 側からは NFS によるマウントで、Windows 側は(Samba による)ネットワークドライブとして、ファイルサーバ(これも Linux が稼働)の特定の領域を共通にアクセスできるようになっています。
Linux 側でクロスコンパイルしたバイナリは、X Window 上で Win32 (& Win16) エミュレータ WINE を使って簡単な動作チェックを行い、さらに WINE の環境にインストールした Inno Setup Compiler でインストール用のパッケージを作成、インストールの動作もチェックします。
最後にこのパッケージを Windows 側からアクセスして、インストールと動作確認をおこないます。
図1:ビットウォークの開発環境(概略)
Linux | ← → | ファイルサーバ | ← → | Windows |
Red Hat Linux 8.0 (メインの開発マシン) | NFS | SMB (Samba) | Windows XP Professional SP1 (最終動作確認) |
| WINE(Win32環境) |
| Inno Setup Compiler |
|
クロスコンパイル環境構築の流れ
MinGW のクロスコンパイル用パッケージについては、本サイトで Red Hat Linux 用の RPM パッケージを公開していますが、ソースからコンパイルしてインストールすることに興味のある方に、コンパイル手順をまとめました。
1. 必要なファイル
まず、SourceForge の MinGW プロジェクトのサイトで公開されている以下のファイルをダウンロードします。バージョン番号は 2002 年 10 月 7 日現在のものです。この部分は最新のリリースに応じて適宜読みかえてください。
また binutils のコンパイルを除き、MinGW のランタイムライブラリがコンパイルに必要となります。「鶏が先か卵が先か」と悩みますが、コンパイル済みのバイナリ(ライブラリとヘッダーファイル)が入手できるので、とりあえず深く考えずに mingw-runtime と w32api のソースとバイナリ両方をダウンロードしておきます。なお、この2つについては、公開されているバイナリをそのまま利用してコンパイルする作業を節約することもできますが、ここでは、コンパイルし直して上書きインストールをするという立場を取ります。
- mingw-runtime-2.2.tar.gz ← コンパイル済みバイナリ
- w32api-2.1.tar.gz ← コンパイル済みバイナリ
- binutils-2.13.90-20021006-1-src.tar.gz
- gcc-3.2-20020817-1.src.tar.gz
- mingw-runtime-2.2-src.tar.gz
- w32api-2.1-src.tar.gz
これらのファイルはすべて /home/bitwalk/mingw/download にあるものとして説明します。
なお、Linux 上で GCC クロスコンパイル環境を構築するためには、Linux ネイティブな GNU C コンパイラが必要になります。ここでは GCC-3.2 のクロスコンパイル環境を構築しますが、Linux ネイティブな GNU C コンパイラとして、2.95(.2) 以上のバージョンが必要になります。Red Hat linux 8.0 では GCC-3.2 が採用されていますので、もちろん問題がありません。他のディストリビューション上でクロスコンパイル環境を構築する際にはご注意ください。
2. ディレクトリの作成とバイナリの展開
ここでは、コンパイルしたソースを /usr/local 以下にインストールするものとして説明をします。binutils をコンパイル/インストールした後でも構いませんが、ここでコンパイル済みバイナリを置くディレクトリを作成しておきます。
$ su ← ルート権限でディレクトリを作成します。
Password:
# mkdir /usr/local/i386-mingw32
$ cd /usr/local/i386-mingw32
$ tar zxvf /home/bitwalk/mingw/download/mingw-runtime-2.2.tar.gz
:
$ tar zxvf /home/bitwalk/mingw/download/w32api-2.1-src.tar.gz
:
$ exit
3. ソースファイルの展開
$ mkdir ~/mingw/src ← bitwalk というユーザアカウントで作業していると仮定。
$ cd ~/mingw/src
$ tar zxvf ../download/binutils-2.13.90-20021006-1-src.tar.gz
:
$ tar zxvf ../download/gcc-3.2-20020817-1.src.tar.gz
:
$ tar zxvf ../download/mingw-runtime-2.2-src.tar.gz
:
$ tar zxvf ../download/w32api-2.1-src.tar.gz
:
$ ln -s binutils-2.13.90-20021006-1 binutils
$ ln -s gcc-3.2-20020817-1 gcc
$ ln -s mingw-runtime-2.2 runtime
$ ln -s w32api-2.1 w32api
4. binutils のコンパイル
$ mkdir ~/mingw/bld
$ mkdir ~/mingw/bld/binutils
$ cd ~/mingw/bld/binutils
$ ../../src/binutils/configure --prefix=/usr/local --target=i386-mingw32 -v
:
$ make
:
$ su
Password:
$ make install
:
$ exit
$ export PATH=$PATH:/usr/local/bin ← パスを通しておきます。
binutils のインストール後、インストール先のパスを通しておいてください。上の例では bash を使っていますが csh 系のシェルをお使いの場合は、setenv で設定します。
もちろん、インストール先のパスが既に通っている場合は、あらためてパスを通す必要はありません。
5. gcc のコンパイル
$ mkdir ~/mingw/bld/gcc
$ cd ~/mingw/bld/gcc
$ ../../src/gcc/configure --prefix=/usr/local --target=i386-mingw32 -v
:
$ cd ..
$ make ← gnat(Ada) はここではコンパイルされません。
:
$ su
Password:
$ make install
:
$ exit
6. mingw-runtime のコンパイル
$ mkdir ~/mingw/bld/runtime
$ cd ~/mingw/bld/runtime
$ AS=i386-mingw32-as \
> CC=i386-mingw32-gcc \
> AR=i386-mingw32-ar \
> RANLIB=i386-mingw32-ranlib \
> LD=i386-mingw32-ld \
> DLLTOOL=i386-mingw32-dlltool \
> WINDRES=i386-mingw32-windres \
> ../../src/runtime/configure --prefix=/usr/local/i386-mingw32 \
> --target=i386-mingw32 -v
:
$ make
:
$ su
Password:
$ make install
:
$ exit
7. w32api のコンパイル
$ mkdir ~/mingw/bld/w32api
$ cd ~/mingw/bld/a32api
$ AS=i386-mingw32-as \
> CC=i386-mingw32-gcc \
> AR=i386-mingw32-ar \
> RANLIB=i386-mingw32-ranlib \
> LD=i386-mingw32-ld \
> DLLTOOL=i386-mingw32-dlltool \
> WINDRES=i386-mingw32-windres \
> ../../src/w32api/configure --prefix=/usr/local/i386-mingw32 \
> --target=i386-mingw32 -v
:
$ make
:
$ su
Password:
$ make install
:
$ exit
なお、環境設定については、コンパイルの度に AS=... などとタイプするのは面倒なので、次のようなシェルスクリプトを作っておけば作業が捗ります。
#!/bin/bash
target=i386-mingw32
export AS=${target}-as
export CC=${target}-gcc
export AR=${target}-ar
export RANLIB=${target}-ranlib
export LD=${target}-ld
export DLLTOOL=${target}-dlltool
export WINDRES=${target}-windres
make clean
rm -f config.*
../../src/w32api/configure --prefix=/usr/local/$target --target=$target -v
|